#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
权限系统初始化脚本
创建角色、权限和角色权限关联
"""

from backend.infrastructure.database import db
from backend.models.role import Role
from backend.models.permission import Permission
from backend.models.role_permission import RolePermission

def init_permissions():
    """初始化权限系统"""
    
    # 定义权限列表
    permissions_data = [
        # 用户管理权限
        ('user:read', '查看用户信息', '可以查看用户列表和详细信息'),
        ('user:write', '编辑用户信息', '可以创建、修改、删除用户'),
        ('user:role', '用户角色管理', '可以分配和移除用户角色'),
        
        # 学生管理权限
        ('student:read', '查看学生信息', '可以查看学生列表和详细信息'),
        ('student:write', '编辑学生信息', '可以创建、修改、删除学生'),
        ('student:bind', '学生绑定管理', '可以管理学生和家长的绑定关系'),
        
        # 干预记录权限
        ('intervention:read', '查看干预记录', '可以查看干预记录列表和详细信息'),
        ('intervention:write', '编辑干预记录', '可以创建、修改、删除干预记录'),
        ('intervention:execute', '执行干预', '可以执行干预任务'),
        
        # 报告权限
        ('report:read', '查看报告', '可以查看各类报告'),
        ('report:generate', '生成报告', '可以生成和导出报告'),
        ('report:manage', '报告管理', '可以管理报告模板和配置'),
        
        # 视力数据权限
        ('vision:read', '查看视力数据', '可以查看视力检测数据'),
        ('vision:write', '编辑视力数据', '可以录入、修改视力数据'),
        ('vision:analyze', '视力数据分析', '可以进行视力数据分析'),
        
        # 系统管理权限
        ('system:manage', '系统管理', '可以进行系统配置和管理'),
        ('role:manage', '角色管理', '可以管理角色和权限'),
        ('permission:manage', '权限管理', '可以管理权限配置'),
        ('log:read', '查看日志', '可以查看系统操作日志'),
        
        # 小程序权限
        ('miniprogram:access', '小程序访问', '可以访问小程序功能'),
        ('miniprogram:bind', '小程序绑定', '可以在小程序中绑定学生'),
        
        # 审核权限
        ('audit:role', '角色申请审核', '可以审核用户角色申请'),
        ('audit:data', '数据审核', '可以审核数据修改申请'),
    ]
    
    # 创建权限
    print("创建权限...")
    for code, name, description in permissions_data:
        permission = Permission.query.filter_by(code=code).first()
        if not permission:
            permission = Permission(
                code=code,
                name=name,
                description=description,
                status='active'
            )
            db.session.add(permission)
            print(f"创建权限: {code} - {name}")
    
    # 定义角色及其权限
    roles_permissions = {
        'admin': {
            'description': '系统管理员 - 拥有所有权限',
            'permissions': [p[0] for p in permissions_data]  # 所有权限
        },
        'teacher': {
            'description': '教师 - 学生管理、干预执行、报告查看',
            'permissions': [
                'user:read', 'student:read', 'student:write', 'student:bind',
                'intervention:read', 'intervention:write', 'intervention:execute',
                'report:read', 'report:generate', 'vision:read', 'vision:write',
                'vision:analyze', 'log:read'
            ]
        },
        'doctor': {
            'description': '医生 - 视力数据分析、干预建议、报告生成',
            'permissions': [
                'student:read', 'intervention:read', 'intervention:write',
                'report:read', 'report:generate', 'report:manage',
                'vision:read', 'vision:write', 'vision:analyze'
            ]
        },
        'operator': {
            'description': '操作员 - 数据录入、基础操作',
            'permissions': [
                'student:read', 'student:write', 'intervention:read',
                'vision:read', 'vision:write', 'report:read'
            ]
        },
        'parent': {
            'description': '家长 - 查看学生信息、干预记录、报告等',
            'permissions': [
                'student:read', 'intervention:read', 'report:read',
                'vision:read', 'miniprogram:access', 'miniprogram:bind'
            ]
        },
        'registered_user': {
            'description': '注册用户 - 浏览公共信息、申请角色提升',
            'permissions': [
                'miniprogram:access'
            ]
        },
        'guest': {
            'description': '访客 - 仅可查看公开信息',
            'permissions': []
        }
    }
    
    # 创建角色和角色权限关联
    print("创建角色和权限关联...")
    for role_name, role_data in roles_permissions.items():
        # 创建或更新角色
        role = Role.query.filter_by(name=role_name).first()
        if not role:
            role = Role(
                name=role_name,
                description=role_data['description'],
                status='active'
            )
            db.session.add(role)
            db.session.flush()
            print(f"创建角色: {role_name}")
        else:
            role.description = role_data['description']
            print(f"更新角色: {role_name}")
        
        # 删除旧的权限关联
        RolePermission.query.filter_by(role_id=role.id).delete()
        
        # 创建新的权限关联
        for perm_code in role_data['permissions']:
            permission = Permission.query.filter_by(code=perm_code).first()
            if permission:
                role_perm = RolePermission(
                    role_id=role.id,
                    permission_id=permission.id
                )
                db.session.add(role_perm)
                print(f"  关联权限: {perm_code}")
    
    db.session.commit()
    print("权限系统初始化完成！")

def show_permissions_matrix():
    """显示权限矩阵"""
    print("\n=== 权限矩阵 ===")
    
    roles = Role.query.filter_by(status='active').all()
    permissions = Permission.query.filter_by(status='active').all()
    
    # 打印表头
    print(f"{'权限代码':<20} {'权限名称':<15} ", end="")
    for role in roles:
        print(f"{role.name:<12}", end=" ")
    print()
    
    print("-" * (35 + len(roles) * 13))
    
    # 打印权限行
    for permission in permissions:
        print(f"{permission.code:<20} {permission.name:<15} ", end="")
        
        for role in roles:
            # 检查角色是否有此权限
            has_perm = permission in role.permissions.all()
            print(f"{'✓':<12}" if has_perm else f"{'×':<12}", end=" ")
        print()

if __name__ == '__main__':
    from app import create_app
    
    app = create_app()
    with app.app_context():
        try:
            init_permissions()
            show_permissions_matrix()
        except Exception as e:
            print(f"初始化失败: {e}")
            db.session.rollback()
